//
// Created by 86136 on 2024/11/28.
//
#include "chatserver.hpp"
#include "chatservice.hpp"
#include <iostream>
#include <string>
#include <functional>
#include "json.hpp"
using namespace std;
using namespace placeholders;
using json = nlohmann::json;

ChatServer::ChatServer(EventLoop *loop,
                       const InetAddress &listenAddr,
                       const string &nameArg)
                       : _server(loop, listenAddr, nameArg)
                       , _loop(loop){
    // 给服务器注册用户连接的创建和断开回调
    _server.setConnectionCallback(bind(&ChatServer::onConnection, this, _1));

    // 给服务器注册用户读写事件回调
    _server.setMessageCallback(bind(&ChatServer::onMessage, this, _1, _2, _3));

    // 设置服务器端的线程数量  muduo库自动分配：1个IO线程  3个worker线程
    _server.setThreadNum(4);
}

void ChatServer::start() {
    _server.start();
}

void ChatServer::onConnection(const TcpConnectionPtr &conn) {
    // 用户断开连接
    if (!conn->connected()) {
        // 处理异常关闭
        ChatService::instance()->clientCloseException(conn);
        conn->shutdown();
    }

}
void ChatServer::onMessage(const TcpConnectionPtr &conn,    // 连接
               Buffer *buffer,                  // 缓冲区
               Timestamp time) {                // 接收到数据的时间信息
    string buf = buffer->retrieveAllAsString();
    // 数据的反序列化
    json js = json::parse(buf);

    cout << "recv: " << js << endl;

    // 通过js["msgid"]绑定回调操作 获取业务handler->conn js time
    // 目的：完全解耦网络模块代码和业务模块代码
    auto msgHander = ChatService::instance()->getHandler(js["msgid"].get<int>());
    // 回调消息绑定好的事件处理器来执行相应的业务处理
    msgHander(conn, js, time);

}

